-- -- Copyright 2014 Alessandro Gerlinger Romero -- -- This file is part of Hybrid fUML. -- -- Hybrid fUML is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Hybrid fUML is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with Hybrid fUML. If not, see . -- ------------------------------------------------------------------------------------------------------------------------------------------------------------ -- DERIVED FUNCTIONS -- defined to support used UML derived attributes -- -- implementation of derived constraint from UML derive: if end->exists( e.role.oclIsKindOf(Port) and e.partWithPort->isEmpty() and not e.role.oclAsType(Port).isBehavior) then ConnectorKind::delegation else ConnectorKind::assembly function_Feature_Connector_kind :: FUML_Syntax_Classes_Kernel_Feature -> FUML_Syntax_Extensions_CompositeStructures_ConnectorKind function_Feature_Connector_kind c | function_Feature_type(c) == FUML_Syntax_Extensions_CompositeStructures_Connector = if hasDelegation then FUML_Syntax_Extensions_CompositeStructures_ConnectorKind_delegation else FUML_Syntax_Extensions_CompositeStructures_ConnectorKind_assembly | otherwise = error( "function_Feature_Connector_kind. Unsupported feature type " ++ show (function_Feature_type c) ++ " " ++ show c) where ces = expr2list $ function_Feature_Connector_end c hasDelegation = length (filter (\ce -> function_Feature_type (function_ConnectorEnd_role ce) == FUML_Syntax_Extensions_CompositeStructures_Port && function_ConnectorEnd_partWithPort ce == FUML_Syntax_Classes_Kernel_FeatureEmpty && function_Feature_Port_isBehavior (function_ConnectorEnd_role ce) == False) ces ) > 0 -- -- implementation of derived relationships between features and classifiers function_Feature_featuringClassifier :: FUML_Syntax_Classes_Kernel_Feature -> {FUML_Syntax_Classes_Kernel_Classifier} function_Feature_featuringClassifier f = mkSet $ filter (\c -> c /= FUML_Syntax_Classes_Kernel_ClassifierEmpty) [(function_Property_owningAssociation f), (function_Property_datatype f), (function_Property_class f)] function_Classifier_feature :: FUML_Syntax_Classes_Kernel_Classifier -> {FUML_Syntax_Classes_Kernel_Feature} function_Classifier_feature c = mkSet $ filter (\f -> f /= FUML_Syntax_Classes_Kernel_FeatureEmpty) $ expr2list $ (function_Classifier_Signal_ownedAttribute c) `union` (function_DataType_ownedAttribute c) `union` (function_Classifier_StructuredClassifier_ownedAttribute c) `union` (function_Classifier_EncapsulatedClassifier_ownedPort c) `union` (function_Classifier_StructuredClassifier_ownedConnector c) `union` (function_Class_ownedAttribute c) `union` (function_Class_ownedOperation c) `union` (function_Classifier_Class_ownedReception c) -- -- implementation of derived relationships between actions and pins function_ActivityNode_Action_output :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> {FUML_Syntax_Activities_IntermediateActivities_ActivityNode} function_ActivityNode_Action_output ac = mkSet $ filter (\n -> n /= FUML_Syntax_Activities_IntermediateActivities_ActivityNodeEmpty) $ [(function_ActivityNode_ValueSpecificationAction_result ac), (function_ActivityNode_CreateObjectAction_result ac), (function_ActivityNode_ReadStructuralFeatureAction_result ac), (function_ActivityNode_WriteStructuralFeatureAction_result ac), (function_ActivityNode_ReadSelfAction_result ac), --(function_ActivityNode_TestIdentityAction_result ac), (function_ActivityNode_ClearStructuralFeatureAction_result ac) ] ++ expr2list (function_ActivityNode_AcceptEventAction_result ac) ++ expr2list (function_ActivityNode_CallAction_result ac) ++ expr2list (function_ActivityNode_StructuredActivityNode_structuredNodeOutput ac) function_ActivityNode_Action_input :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> {FUML_Syntax_Activities_IntermediateActivities_ActivityNode} function_ActivityNode_Action_input ac = mkSet $ filter (\n -> n /= FUML_Syntax_Activities_IntermediateActivities_ActivityNodeEmpty) $ [(function_ActivityNode_StartObjectBehaviorAction_object ac), --(function_ActivityNode_CallOperationAction_target ac), (function_ActivityNode_SendSignalAction_target ac), (function_ActivityNode_AddStructuralFeatureValueAction_insertAt ac), (function_ActivityNode_StructuralFeatureAction_object ac), (function_ActivityNode_WriteStructuralFeatureAction_value ac), --(function_ActivityNode_TestIdentityAction_first ac), --(function_ActivityNode_TestIdentityAction_second ac), (function_ActivityNode_RemoveStructuralFeatureValueAction_removeAt ac) ] ++ expr2list (function_ActivityNode_StructuredActivityNode_structuredNodeInput ac) ++ expr2list (function_ActivityNode_InvocationAction_argument ac) -- UML 2.4.1 PP 97 --[4] The query lowerBound() returns the lower bound of the multiplicity as an integer. --MultiplicityElement::lowerBound() : [Integer]; --lowerBound = if lowerValue->isEmpty() then 1 else lowerValue.integerValue() endif -- ASSUMES LiteralInteger function_ActivityNode_lower :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Int function_ActivityNode_lower n = if function_ActivityNode_MultiplicityElement_lowerValue n == FUML_Syntax_Classes_Kernel_ValueSpecificationEmpty then 1 else function_ValueSpecification_LiteralInteger_value( function_ActivityNode_MultiplicityElement_lowerValue n) -- UML 2.4.1 PP 97 --[5] The query upperBound() returns the upper bound of the multiplicity for a bounded multiplicity as an unlimited natural. --MultiplicityElement::upperBound() : [UnlimitedNatural]; --upperBound = if upperValue->isEmpty() then 1 else upperValue.unlimitedValue() endif -- ASSUMES LiteralInteger function_ActivityNode_upper :: FUML_Syntax_Activities_IntermediateActivities_ActivityNode -> Int function_ActivityNode_upper n = if function_ActivityNode_MultiplicityElement_upperValue n == FUML_Syntax_Classes_Kernel_ValueSpecificationEmpty then 1 else function_ValueSpecification_LiteralInteger_value( function_ActivityNode_MultiplicityElement_upperValue n)